# 使用蓝图
from flask import Blueprint, request, render_template
from sqlalchemy import desc, and_, not_, or_

from .models import *

blue = Blueprint('user',__name__)


@blue.route('/')
def index():
    return 'index'

# 增加
@blue.route('/useradd')
def user_add():
    # 添加一条数据
    # u = User()
    # u.name = 'kun'
    # u.age = 24
    # db.session.add(u)
    # db.session.commit()

    users = []
    for i in range(10, 30):
        u = User()
        u.name = '冰冰' + str(i)
        u.age = i;
        users.append(u)

    try:
        db.session.add_all(users)
        db.session.commit() # 事务提交
    except Exception as e:
        db.session.rollback()  # 回滚
        db.session.flush() # 清楚缓存
        return 'fail:' + str(e)

    return 'success!'

# 删除数据
@blue.route('/userdel')
def user_del():
    u = User.query.first() # 删除第一条数据
    db.session.delete(u)
    db.session.commit()

    return 'success!'

# 修改数据
@blue.route('/userupdate/')
def user_update():
    u = User.query.first() # 修改第一条数据
    u.age = 1000
    db.session.commit()
    return 'success!'

# 查询数据
@blue.route('/userget/')
def user_get():
    # 全部查询出来
    # users = User.query.all()
    # print(users)

    # get()拿到指定的对象
    # user = User.query.get(8)
    # print(user, type(user))
    # print(user.name, user.age)

    # filter()和filter_by()区别
    # user1 = User.query.filter(User.age == 20)
    # user2 = User.query.filter_by(age=20)
    # print(list(user1))
    # print(list(user2))

    # first（）：第一条数据
    # first_or_404(): 第一条数据，如果不存在就抛出404
    # user = User.query.filter_by(age = 100).first_or_404()
    # print(user)

    # count（）：统计查询集中的数据条数
    # users = User.query.filter()
    # print(users.count())

    # limit() 前几条 offset() 跳过前几条
    # users = User.query.offset(3).limit(10)
    # print(list(users))

    # order_by() : 排序
    # user = User.query.order_by('age') # 升序
    # user = User.query.order_by(desc('age'))
    # print(list(user))

    # 逻辑运算符
    # users = User.query,filter(User.age > 20, User.age < 25)
    users = User.query.filter(and_(User.age > 20, User.age < 25))
    users = User.query.filter(or_(User.age > 25, User.age < 20))
    # users = User.query.filter(not_(or_(User.age > 25, User.age < 20)))
    # print(list(users))

    # 模糊查询
    # users = User.query.filter(User.name.contains('3'))
    # print(list(users))

    # # in查询
    # users = User.query.filter(User.age.in_([10,20,30,40,50]))
    # print(list(users))

    # 以什么开头或结尾
    # users = User.query.filter(User.name.startswith('冰'))
    # users = User.query.filter(User.name.endswith('2'))
    # print(list(users))

    # 大于
    users = User.query.filter(User.age.__gt__(25))
    print(list(users))

    return 'success!'

# 分页功能
@blue.route('/paginate/')
def get_paginate():
    # 页码：默认第一页
    page = int(request.args.get('page', 1))
    # per_page: 每页显示数量
    per_page = int(request.args.get('per_page', 5))
    print(page, type(page))
    print(per_page, type(per_page))

    # paginate
    p = User.query.paginate(page = page, per_page = per_page, error_out = False)
    # 返回当前页内容
    print(p.items)
    # 是否还有下一页
    print(p.has_next)
    # 是否还有上一页
    print(p.has_prev)
    # 返回下一页对象
    print(p.next(error_out=False).items)
    # 返回上一页对象
    print(p.prev(error_out=False).items)
    # 当前的页码
    print(p.page)
    # 总页数
    print(p.pages)
    # 上一页页码数
    print(p.prev_num)
    # 下一页页码数
    print(p.next_num)
    # 总记录数
    print(p.total)
    return render_template('paginate.html', p = p)


